# 两个装饰器
    # @classmethod  *****
        # 什么时候用?
        # 怎么定义?
            # 装饰器怎么加
            # 参数怎么改?
        # 怎么用?
            # 用谁来调用?
    # @staticmethod *
        # 什么时候用?
            # 帮助我们把一个普通的函数挪到类中来直接使用,制造静态方法用的
        # 怎么定义?
        # 怎么用?用谁来调用?
# 一些内置的魔术方法
    # __new__  :
        # 什么时候执行
        # 为什么要有,用来做什么的?   创建一个对象需要的空间的
        # 单例模式(默写)
    # __call__ : 对象() 调用这个类中的__call__方法
    # __len__  : len(对象) 需要实现这个类中的__len__方法
    # __str__  : 帮助我们在打印\展示对象的时候更直观的显示对象内容 %s str() print()
    # __repr__ : repr是str的备胎,同时还和%r和repr有合作关系
    # __enter__:
    # __exit__ :
    # __eq__   :

class Goods:
    __discount=0.8
    def __init__(self):
        self.__price=5
        self.price=self.__price*self.__discount
    @classmethod  # 把一个对象绑定的方法 修改成一个 类方法
    def change_discount(cls,new_discount):#cls 指向类名
        cls.__discount=new_discount
# 什么时候用@classmethod?
    # 1.定义了一个方法,默认传self,但这个self没被使用
    # 2.并且你在这个方法里用到了当前的类名,或者你准备使用这个类的内存空间中的名字的时候
# @classmethod   # 把一个对象绑定的方法 修改成一个 类方法
# 第一,在方法中仍然可以引用类中的静态变量
# 第二,可以不用实例化对象,就直接用类名在外部调用这个方法

# aplle.change_discount(0.6)
Goods.change_discount(0.6)  # 类方法可以通过类名调用
aplle=Goods()


print(aplle.price)
Goods.change_discount(0.5)
print(aplle.price)
aplle2=Goods()
print(aplle2.price)

# apple=Goods()
# print(apple.price)   4.0
# apple.change_discount(0.6)
# print(apple.price)   4.0
# apple2=Goods()
# print(apple2.price)#    3.0
import time

class Date:
    def __init__(self,year,month,day):
        self.year=year
        self.month=month
        self.day=day
    @classmethod
    def today(cls):
        sttuct_t=time.localtime()
        date = cls(sttuct_t.tm_year, sttuct_t.tm_mon,  sttuct_t.tm_mday)
        return date
date=Date.today()
print(date.year)
print(date.month)
print(date.day)
































































